你也喜欢柯基吗

啊哈,一起去狗咖吗

0%

sqli-labs-less23-28

可以发现,我们在第10关之后的通关速度变快了,因为后面的关卡基本上都是相似的东西,我们只需要将其简要的修改就可以了。

Less23

第23关重新回到get请求,会发现输入单引号报错,但是注释符不管用了。可以猜测注释符被过滤了,我们来到源代码中查询

证实了我们的猜测,之前提到过使用or ‘1’=’1来进行注释,我们这里来试试,正常回显,所以这个方法是正确的,接下来我们就可以使用联合注入来进行查询结果了。
同时我们再补充一种注释方法,;%00,我们知道;是我们正常语言中的结束符,而%00是php语言中的结束符,既然输入了结束符,那么就代表着这句话到这里就结束了,后面的东西就相当于是注释掉了,如图:

发现些新的东西,也补充一下吧

Less24

可以发现这关会比较特殊,它有登入,注册和修改密码的页面。
没有思路,那我们直接来看源代码:


登录页面和注册页面的对于账号和密码都使用了mysql_real_escape_string函数对于特殊字符进行了转义,但只是在调用sql语句的时候进行转义,当注册成功后账号密码存到数据库的时候是没有转义的,是以原本数据存入数据库的,当我们修改密码的时候,对于账户名是没有过滤的。

在过往的题中我们知道他的一个用户名为admin,我们就先注册一个账号名叫admin’#,单引号是为了和之后密码修改的用户名的单引号进行闭合,#是为了注释后面的数据。
设置密码为1,注册成功后,我们同样以admin’#和1进行登录进入修改密码的页面,修改密码为2,之后尝试登录,可以发现我们注册的账户admin’#的密码还是1,而admin的密码修改为2了,说明注入成功。(可以通过sqlmap来辅助理解)

这玩意呢,也叫二次注入看图理解吧

Less25-28

Less25-25a

进入25关我们可以看到一个很大的All your ‘or’ and ‘and’ belong to us.

这时我们就可以往是不是过滤了or和and来想,查看一下源代码

猜测正确,or和and没了,我们就要想办法找东西来替换他们。经过查询学习暂时知道了以下的几种替换方式。
1、大小写混写,比如or写为Or。
2、重写,比如or写为oorr。
3、符号替换,比如or写为||,and写为&&(当在get请求中&可能会被解析,所以我们使用%26%26)
接下来我们就可以开始进行注入了,联合查询即可。
哦对,还要注意order和information中也有or需要进行绕过。
第25关相同,为数字型闭合。

Less26-26a

可以发现26关的页面与25关相似,我们猜测26关是不是过滤了些其他的东西,查看源代码得知,它将逻辑运算符、注释符以及空格都给过滤了,空格绕过通过查询得到了比较多的方法
%09 TAB键(水平)
%a0 新建一行
%0c 新的一页
%0b TAB键(垂直)
%0a 新建一行
%a0 空格
使用()包裹
前几个都较好理解,那么使用()包裹是什么意思呢,我们来演示一遍,因为报错型注入空格较少,所以我们使用报错型注入进行简要演示。(但是在尝试后发现只有()能用,好像是因为在Windows系统下apache解析不了空格)
获取数据内容

?id=1'||(updatexml(1,concat(0x7e,(select(group_concat(passwoorrd,username))from(users))),1))||'1'='1


26a,与26也大致相同,闭合为’),并且26a的页面不显示报错页面,所以我们使用联合注入或者盲注。

Less27-27a

第27关过滤了union和select但没过滤or和and,我们使用双写或大小写绕过。
27a的闭合是”,且与26a相同没有报错页面,所以我们使用联合注入或者盲注。

Less28-28a

瞅眼源代码先

该关卡过滤了注释符空格还过滤了union和select。s表示空格,+表示匹配一次或多次,/i表示不区分大小写,所以整体表示匹配 union加一个或多个空格加select,其中union和select不区分大小。所以我们可以使用重写绕过写。
查个表名吧

?id=0')uni union%0Aselecton%0Aselect%0A1,2,group_concat(table_name)from%0Ainformation_schema.tables%0Awhere%0Atable_schema='security'and ('1

28a只过滤了union和select,重写一下联合注入就好了。
(在后面的尝试中,我们也发现空格可以使用之前提到的绕过方法,但是26和26a就是不可以,有点不理解,以后理解后再做补充)